/**
 *
 * 一般通过为对象的属性赋值的情况下，对象的属性可以修改也可以删除，
 * 但是通过Object.defineProperty()定义属性，
 * 通过描述符的设置可以进行更精准的控制对象属性。
 *
 Object.defineProperty()的作用就是直接在一个对象上定义一个新属性，或者修改一个已经存在的属性
 Object.defineProperty(obj, prop, desc)
 obj 需要定义属性的当前对象
 prop 当前需要定义的属性名
 desc 属性描述符
 */


let Person = {}
Object.defineProperty(Person, 'name', {
    value: '王昭君',
    writable: false //是否可以改变  默认是false，不可以改变
})
console.log(Person.name);//王昭君
Person.name = "貂蝉"
console.log(Person.name);//王昭君


function Test(){
    let obj = {}
    this.name = '貂蝉'

    this.run = function(fn){
        if(fn){
            Object.defineProperty(obj, 'name', {
                value: this.name,
                writable: false //是否可以改变  默认是false，不可以改变
            })
            fn(obj)
        }
    }

}

var test =new Test();
test.run(function(obj){
    obj.name = "安其拉"
    console.log(obj.name)
})